1. Servlet
2. HTTP协议
3. Request
//从上到下爷孙三人Servlet -- 接口|GenericServlet -- 抽象类|HttpServlet -- 抽象类
@WebServlet("/demo2")public class ServletDemo2 extends GenericServlet {@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("demo2...");}//想重写那个方法自己手动添加即可(输入init)}
@WebServlet("/demo3")public class ServletDemo3 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet...");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");}}
@WebServlet({"/d4","/dd4","/ddd4"})
//第一种:@WebServlet("/d4")//第二种:表示三个都可以访问@WebServlet({"/d4","/dd4","/ddd4"})//第三种:表示有层级关系,都写才可以@WebServlet({"/user/d4")//第四种:表示user后面跟什么都可以被访问(访问权限最低)@WebServlet({"/user/*")//第五种:必须要加.do,且前面不能加/@WebServlet({"*.do")
f12
–>Network
–>点入访问页面
–>Headers
请求方式 请求url 请求协议/版本GET /login.html HTTP/1.1
请求头名称: 请求头值
空行,就是用于分割POST请求的请求头,和请求体的。
封装POST请求消息的请求参数的username=zhangsan
//请求行和请求头一起的//请求行(请求方式 请求url 请求协议/版本)POST /login.html HTTP/1.1//请求头Host: localhost //请求主机User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 //告诉服务器,作为浏览器可以响应什么样的信息格式Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2//告诉服务器,作为浏览器可以支持的语言环境Accept-Encoding: gzip, deflate//告诉服务器,作为浏览器可以压缩的格式Referer: http://localhost/login.htmlConnection: keep-alive//连接可以被复用Upgrade-Insecure-Requests: 1//关于升级的//请求空行//请求体username=zhangsan
ServletRequest-->接口(实现Servlet接口时候重写的service方法中的对象)| HttpServletRequest接口继承ServletRequest接口HttpServletRequest-->接口(继承HttpServlet类时候重写的doGet方法中的对象)| RequestFacade类实现了HttpServletRequest接口RequestFacade 类(tomcat编写的,包路径:org.apache.catalina.connector.RequestFacade)
@WebServlet("/demo1")public class ServletDemo1 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {}@Overridepublic ServletConfig getServletConfig() {return null;}//这里的参数类型@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("demo1...");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {}}
@WebServlet({"/d4", "/dd4", "/ddd4"})public class ServletDemo4 extends HttpServlet {//这里的参数类型@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("demo4");}}
GET /day14/demo1?name=zhangsan HTTP/1.1
/*** 演示request对象获取请求行数据*/@WebServlet("/requestDemo1")public class RequestDemo1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1. 获取==请求方式== :GETString method = req.getMethod();System.out.println(method);//2. (*)获取==虚拟目录【重点掌握】==:/day14String contextPath = req.getContextPath();System.out.println(contextPath);//3. 获取==Servlet路径==: /requestDemo1String servletPath = req.getServletPath();System.out.println(servletPath);//4. 获取==get方式请求参数==:name=zhangsanString queryString = req.getQueryString();System.out.println(queryString);//5. (*)获取==请求URI【重点掌握】==:/day14/requestDemo1String requestURI = req.getRequestURI();StringBuffer requestURL = req.getRequestURL();System.out.println(requestURI);System.out.println(requestURL);//6. 获取==协议及版本==:HTTP/1.1String protocol = req.getProtocol();System.out.println(protocol);//7. 获取==客户机的IP地址==:String remoteAddr = req.getRemoteAddr();System.out.println(remoteAddr);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}}//结果:GET/day14/requestDemo1name=zhangsan&age=2/day14/requestDemo1http://localhost:8080/day14/requestDemo1HTTP/1.10:0:0:0:0:0:0:1
@WebServlet("/requestDemo2")public class RequestDemo2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//演示获取请求头数据//1.获取所有请求头名称Enumeration
//案例:获取user-agent请求头数据,来解决浏览器的兼容性问题String agent = req.getHeader("user-agent");if(agent.contains("Chrome")){//表示使用的谷歌浏览器System.out.println("谷歌来了。。。");}else if(agent.contains("Firefox")){//表示使用火狐浏览器System.out.println("火狐来了。。。");}
String referer = req.getHeader("referer"); //referer是告诉服务器,我(当前请求)从哪里来//从login页面中获取到的http://localhost:8080/day14/login.htmlSystem.out.println(referer); //不是从别的超链接点击过来的就为null,因为自己请求自己(需要别的网址访问该url)//防盗链if(referer != null){ //表示不是自己请求自己if(referer.contains("/day14")){//正常访问://System.out.println("播放电影");//显示到服务器端的方式//这里是response方式//先设置一下可以中文显示resp.setContentType("text/html;charset=utf-8");//再显示到页面上resp.getWriter().write("播放电影...");}else {//盗链//System.out.println("请来正规网址观看电影");//这里是response方式//先设置一下可以中文显示resp.setContentType("text/html;charset=utf-8");//再显示到页面上resp.getWriter().write("请来正规网址观看电影...");}}//本项目访问该的网站demo4...//另一个项目访问该网站demo4...//结果:http://localhost:8080/day14/login.html播放电影http://localhost/index.html请来正规网址观看电影
@WebServlet("/requestDemo5")
public class RequestDemo5 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求消息体-->请求参数//1.获取字符流BufferedReader br = req.getReader();//2.读取数据String line = null;while((line = br.readLine()) != null){System.out.println(line);}}
}
@WebServlet("/requestDemo6")public class RequestDemo6 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//get 请求参数//根据参数名称获取参数值String username = req.getParameter("username");/*System.out.println("get");System.out.println(username);*///结果:getadmin//根据参数名称获取参数值的数组String[] hobbys = req.getParameterValues("hobby");/*for (String hobby : hobbys) {System.out.println(hobby);}*///结果:gamestudy//获取所有请求的参数名称Enumeration
@WebServlet("/requestDemo7")public class RequestDemo7 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置流的编码格式(字符集)req.setCharacterEncoding("utf-8");//获取请求参数usernameString username = req.getParameter("username");System.out.println(username);}}
//RequestDemo8的doPost中System.out.println("demo8被访问了");//请求转发到requestDemo9中req.getRequestDispatcher("/requestDemo9").forward(req, resp);//RequestDemo9的doPost中System.out.println("demo9被访问了");//结果:demo8被访问了demo9被访问了
//RequestDemo8的doPost中System.out.println("demo8被访问了");//在请求转发之前,存储数据req.setAttribute("msg", "hello");//请求转发到requestDemo9中req.getRequestDispatcher("/requestDemo9").forward(req, resp);//RequestDemo9的doPost中//获取数据Object msg = req.getAttribute("msg");System.out.println(msg);System.out.println("demo9被访问了");//结果:demo8被访问了hellodemo9被访问了
CREATE DATABASE day14;USE day14;CREATE TABLE user(id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(32) UNIQUE NOT NULL,password VARCHAR(32) NOT NULL);
package cn.itcast.domain;/*** 用户的实体类*/public class User {private int id;private String username;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}
package cn.itcast.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import javax.xml.crypto.Data;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;/*** JDBC工具类 使用Durid连接池*/public class JDBCUtils {private static DataSource ds ;static {try {//1.加载配置文件Properties pro = new Properties();//使用ClassLoader加载配置文件,获取字节输入流InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//2.初始化连接池对象ds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接池对象*/public static DataSource getDataSource(){return ds;}/*** 获取连接Connection对象*/public static Connection getConnection() throws SQLException {return ds.getConnection();}}
package cn.itcast.dao;import cn.itcast.domain.User;import cn.itcast.util.JDBCUtils;import org.springframework.dao.DataAccessException;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;/*** 操作数据库中User表的类*/public class UserDao {//声明JDBCTemplate对象共用private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());/*** 登录方法* @param loginUser 只有用户名和密码* @return user包含用户全部数据,没有查询到,返回null*/public User login(User loginUser){try {//1.编写sqlString sql = "select * from user where username = ? and password = ?";//2.调用query方法User user = template.queryForObject(sql,new BeanPropertyRowMapper
package cn.itcast.web.servlet;import cn.itcast.dao.UserDao;import cn.itcast.domain.User;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@WebServlet("/loginServlet")public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.设置编码req.setCharacterEncoding("utf-8");//2.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);//4.调用UserDao的login方法UserDao dao = new UserDao();User user = dao.login(loginUser);//5.判断userif(user == null){//登录失败req.getRequestDispatcher("/failServlet").forward(req,resp);}else{//登录成功//存储数据req.setAttribute("user",user);//转发req.getRequestDispatcher("/successServlet").forward(req,resp);}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}}
@WebServlet("/successServlet")public class SuccessServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取request域中共享的user对象User user = (User) request.getAttribute("user");if(user != null){//给页面写一句话//设置编码response.setContentType("text/html;charset=utf-8");//输出response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");}} @WebServlet("/failServlet")public class FailServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//给页面写一句话//设置编码response.setContentType("text/html;charset=utf-8");//输出response.getWriter().write("登录失败,用户名或密码错误");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}}
用户名:
密码:
private int id;public void setChange(int id) {this.id = id;}//这里属性转换成了change,但是他操作的的还是id
//原来:LoginServlet类中//2.获取请求参数String username = req.getParameter("username");String password = req.getParameter("password");//3.封装user对象User loginUser = new User();loginUser.setUsername(username);loginUser.setPassword(password);//替换为://BeanUtils工具类,简化数据封装//2. 获取所有请求参数Map